#include <iostream>
using namespace std;
const int N = 100010;

// son[i][j]:第i个结点的第j个儿子，j的编号和字母有关
// 下标是0的点既是根节点，又是空结点
int son[N][26], cnt[N], idx;
char str[N];

void insert(char str[]) // 将字符串str插入
{
    int p = 0;
    for (int i = 0; str[i]; i++) // 遍历str的每个字符
    {
        int u = str[i] - 'a';  // u为字母编号
        if (!son[p][u])        // p结点若不存在u儿子
            son[p][u] = ++idx; // 则p结点的u儿子存放标记
        p = son[p][u];         // p移到它的儿子
    }
    cnt[p]++; // 加入叶结点标记
}

int query(char str[])
{
    int p = 0; // 寻路点
    for (int i = 0; str[i]; i++)
    {
        int u = str[i] - 'a';
        if (!son[p][u]) // 如果没有该类型的子节点，就直接退出
            return 0;
        p = son[p][u]; // p跳到子结点
    }
    return cnt[p];
}
int main()
{
    int n;
    scanf("%d", &n);
    while (n--)
    {
        char op[2];
        scanf("%s%s", op, str);
        if (op[0] == 'I')
            insert(str);
        else
            printf("%d\n", query(str));
    }
    return 0;
}